/*
 * @Author: QinJiu
 * @Date: 2022-07-22 10:18:49
 * @LastEditors: Qinjiu
 * @LastEditTime: 2022-07-22 14:30:39
 * @Description:
 */
import ErrorComponent from "@/components/ErrorComponent.vue";
import LoadingComponent from "@/components/LoadingComponent.vue";

function delay(duration) {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve();
    }, duration);
  });
}

/**
 * 得到一个异步组件
 * @param {*} () => import('./my-async-component')
 */
export function getAsyncComponent(compResolver) {
  return () => ({
    // 需要加载的组件 (应该是一个 `Promise` 对象)
    component: new Promise(async (resolve, reject) => {
      // 开发环境
      if (process.env.NODE_ENV === "development") {
        await delay(2000);
      }
      try {
        const comp = await compResolver();
        // 组件加载完成
        resolve(comp);
      } catch (error) {
        // 组件加载出错
        reject(error);
      }
    }),
    // 异步组件加载时使用的组件
    loading: LoadingComponent,
    // 加载失败时使用的组件
    error: ErrorComponent,
    // 展示加载时组件的延时时间。默认值是 200 (毫秒)
    // delay: 200
    // 如果提供了超时时间且组件加载也超时了，
    // 则使用加载失败时使用的组件。默认值是：`Infinity`
    // timeout: 3000,
  });
}
